﻿#pragma once
#include "define.h"
#include "define_types.hpp"

// 定义版本号
#define LIGHTNING_VERSION 0.2.0

// 定义上下文类型的枚举值，用于区分不同的运行环境
// 上下文之间进行切换
enum context_type
{
	CT_INVALID,   // 无效的上下文类型
	CT_RUNTIME,   // 运行时上下文
	CT_EVALUATE   // 这个开启的是回测模式
};

// 定义一个 ltobj 结构体，用于存储指向上下文对象的指针和上下文的类型
struct ltobj
{
	void* obj_ptr;         // 指向具体上下文对象的指针
	context_type obj_type; // 上下文对象的类型

	// 构造函数可以被用于初始化 ltobj 的类型和指针（已注释）
	// ltobj(context_type type):obj_type(type), obj_ptr(nullptr) {}
};

// 使用 extern "C" 指示编译器按照 C 语言的方式导出这些接口函数，避免函数名被 C++ 编译器修改
extern "C"
{
	// 定义一个默认的返回值符号，用于没有返回值的函数
	#define VOID_DEFAULT

	// 宏 LT_INTERFACE_DECLARE 定义了一组接口函数，形式为：返回类型 函数名(参数)
	#define LT_INTERFACE_DECLARE(return_type, func_name, args) EXPORT_FLAG return_type lt_##func_name args

	// 宏 LT_INTERFACE_CHECK 用于检查 ltobj 的类型是否合法，并获取上下文对象的指针
	#define LT_INTERFACE_CHECK(object_name, default_return) \
		if (lt.obj_type != CT_RUNTIME && lt.obj_type != CT_EVALUATE)\
		{\
			return default_return; \
		}\
		object_name* c = (object_name*)(lt.obj_ptr); \
		if (c == nullptr)\
		{\
			return default_return; \
		}

	// 宏 LT_INTERFACE_CALL 用于调用上下文对象的成员函数
	// 
	#define LT_INTERFACE_CALL(func_name, args) return c->func_name args;

	// 宏 LT_INTERFACE_IMPLEMENTATION 用于定义接口函数的实现，结合 LT_INTERFACE_CHECK 和 LT_INTERFACE_CALL 使用
	#define LT_INTERFACE_IMPLEMENTATION(return_type ,default_return, object_name ,func_name, formal_args, real_args) return_type lt_##func_name formal_args\
	{\
		LT_INTERFACE_CHECK(object_name, default_return)\
		LT_INTERFACE_CALL(func_name, real_args)\
	}

	// 定义一组回调函数类型，用于处理不同的交易事件
	typedef void (PORTER_FLAG * tick_callback)(const tick_info&);  // 处理 tick 数据的回调
	typedef void (PORTER_FLAG * entrust_callback)(const order_info&);  // 处理委托订单的回调
	typedef void (PORTER_FLAG * deal_callback)(estid_t, uint32_t);  // 处理成交回调
	typedef void (PORTER_FLAG * trade_callback)(estid_t, const code_t&, offset_type, direction_type, double_t, uint32_t);  // 处理交易回调
	typedef void (PORTER_FLAG * cancel_callback)(estid_t, const code_t&, offset_type, direction_type, double_t, uint32_t, uint32_t);  // 处理撤单回调
	typedef void (PORTER_FLAG * error_callback)(error_type, estid_t, error_code);  // 处理错误回调
	typedef void (PORTER_FLAG * cycle_callback)();  // 处理周期性回调

	// 定义 order_event 结构体，用于存储订单相关的回调函数
	struct order_event
	{
		entrust_callback on_entrust;  // 委托订单回调
		deal_callback on_deal;        // 成交回调
		trade_callback on_trade;      // 交易回调
		cancel_callback on_cancel;    // 撤单回调
		error_callback on_error;      // 错误回调

		order_event() = default;  // 默认构造函数
	};

	// 定义创建和销毁上下文对象的函数声明
	EXPORT_FLAG ltobj lt_create_context(context_type ctx_type, const char* config_path);  // 创建上下文对象
	EXPORT_FLAG void lt_destory_context(ltobj& obj);  // 销毁上下文对象

	// 定义一组交易系统的接口函数声明

	/*登录*/
	LT_INTERFACE_DECLARE(bool, login_account, (const ltobj&));

	/*注销*/
	LT_INTERFACE_DECLARE(void, logout_account, (const ltobj&));

	/*启动服务*/
	LT_INTERFACE_DECLARE(bool, start_service, (const ltobj&));
	
	/*停止服务*/
	LT_INTERFACE_DECLARE(bool, stop_service, (const ltobj&));
	
	/*下单接口*/
	LT_INTERFACE_DECLARE(estid_t, place_order, (const ltobj&, offset_type, direction_type, const code_t&, uint32_t, double_t, order_flag));
	
	/*撤单接口*/
	LT_INTERFACE_DECLARE(bool, cancel_order, (const ltobj&, estid_t));

	/*获取仓位信息*/
	LT_INTERFACE_DECLARE(const position_info&, get_position, (const ltobj&, const code_t&));

	/*获取委托订单*/
	LT_INTERFACE_DECLARE(const order_info&, get_order, (const ltobj&, estid_t));
	
	/*订阅行情*/
	LT_INTERFACE_DECLARE(void, subscribe, (const ltobj&, const std::set<code_t>&, tick_callback));
	
	/*取消订阅行情*/
	LT_INTERFACE_DECLARE(void, unsubscribe, (const ltobj&, const std::set<code_t>&));

	/*获取最后时间*/
	LT_INTERFACE_DECLARE(daytm_t, get_last_time, (const ltobj&));

	/*绑定实时事件回调*/
	LT_INTERFACE_DECLARE(void, bind_realtime_event, (const ltobj&, const order_event&, cycle_callback, cycle_callback, cycle_callback));

	/*播放历史数据*/
	LT_INTERFACE_DECLARE(void, playback_history, (const ltobj&));

	/*模拟跨天结算*/
	LT_INTERFACE_DECLARE(void, simulate_crossday, (const ltobj&, uint32_t));

	/*获取最后一次下单时间，跨交易日返回0*/
	LT_INTERFACE_DECLARE(daytm_t, last_order_time, (const ltobj&));
	
	/*获取当前交易日的订单统计，跨交易日会被清空*/
	LT_INTERFACE_DECLARE(const order_statistic&, get_order_statistic, (const ltobj&, const code_t&));

	/*获取交易日*/
	LT_INTERFACE_DECLARE(uint32_t, get_trading_day, (const ltobj&));
	
	/*获取收盘时间*/
	LT_INTERFACE_DECLARE(daytm_t, get_close_time, (const ltobj&));

	/*获取 include 标签中的配置信息*/
	LT_INTERFACE_DECLARE(const char *, get_include_config, (const ltobj&, const char*));

	/*获取今日行情数据*/
	LT_INTERFACE_DECLARE(const today_market_info&, get_today_market_info, (const ltobj&, const code_t&));

	/*获取前一个 tick 数据*/
	LT_INTERFACE_DECLARE(const tick_info&, get_previous_tick, (const ltobj&, const code_t&));
}
